/*
 * Aritmetico.h
 *
 *  Created on: 11/06/2013
 *      Author: juan
 */

#ifndef ARITMETICO_H_
#define ARITMETICO_H_

#include <list>
#include <stdlib.h>
#include <iostream>
#include "../PPMC/Caracter.h"
#include "Particion.h"
#include "BufferDescompresion.h"
#include <bitset>
#include "../../Utilidades/Constantes.h"
#include "ByteBuffer.h"
#include <math.h>

using namespace std;

class Aritmetico {
public:
	Aritmetico();
	virtual ~Aritmetico();

	void getBuffer(char ** compresion, int *largo);
	void comprimir(list<Caracter*>* distrib_frecuencias, Caracter* emision);
	void mostrarAritmetico(); //Para debugging
	void setup_descompresion(char* buffer_descompresion);
	Caracter* descomprimir_caracter(list<Caracter*>* distrib_frecuencias);

private:

	void corregirFrecuencias();
	Caracter * buscarCaracterQueContiene(int i);
	void actualizarLimites(Caracter*distribucion);
	void actualizarFrecuencias(list<Caracter*>* distrib_frecuencias);
	void emitirPiso();
	int normalizar();
	int underflow();
	int overflow();
	void mostrarListaDeCaracteres(list<Caracter*>* distrib_frecuencias);
	void mostrarParticiones(); //Debug

	list<Particion*> * particiones;
	int piso;
	int techo;
	bitset<PRECISION_ARITMETICO> b_piso;
	bitset<PRECISION_ARITMETICO> b_techo;
	int underflow_counter;
	ByteBuffer * bb;
	BufferDescompresion * bd;

};

#endif /* ARITMETICO_H_ */
